﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wrapper_Algos;

namespace Civilisation_code.PCarte
{
    /// <summary>
    /// Implémentation de la création de la carte de taille normale
    /// </summary>
    class Algo_Carte_Normale : Algo_Carte
    {
        /// <summary>
        /// Largeur de la carte
        /// </summary>
        private int L_MAX = 100;

        /// <summary>
        /// Constructeur
        /// </summary>
        public Algo_Carte_Normale()
        {
            //Création du wrapper
            w = new Wrapper(L_MAX);
        }

        /// <summary>
        /// Construit la carte
        /// </summary>
        override public void construire()
        {
            _carte = new Carte(L_MAX, L_MAX);
            genererCases();
        }

        /// <summary>
        /// Génère chaque case
        /// </summary>
        unsafe override protected void genererCases()
        {
            //Stockage du tableau de type de ressource pour chaque case
            int* w_cases = w.recupererCarte();

            //Création des cases une par une
            for (int x = 0; x < L_MAX; x++)
                for (int y = 0; y < L_MAX; y++)
                {
                    traitement_num_cases(w_cases, x, y, L_MAX);
                }

            //Récupération de la valeur de chaque case
            int* w_cases_val = w.getValeurCarte();

            //Création des cases une par une
            for (int x = 0; x < L_MAX; x++)
                for (int y = 0; y < L_MAX; y++)
                {
                    _carte.getCase(x, y)._valeur = w_cases_val[x+y*L_MAX];
                }
        }

        /// <summary>
        /// Traite les cases une par une
        /// </summary>
        /// <param name="w_cases">la carte</param>
        /// <param name="x">coordonnée X</param>
        /// <param name="y">coordonnée Y</param>
        /// <param name="largeur">largeur de la carte</param>
        unsafe override protected void traitement_num_cases(int* w_cases, int x, int y, int largeur)
        {
            //En fonction du nombre, création d'une case avec des ressources différentes
            switch (w_cases[x + y * largeur])
            {
                case 1:
                    _carte.addCase(new Case(x, y, "Plaine", ""));
                    break;
                case 11:
                    _carte.addCase(new Case(x, y, "Plaine", "Fer"));
                    break;
                case 12:
                    _carte.addCase(new Case(x, y, "Plaine", "Fruit"));
                    break;
                case 2:
                    _carte.addCase(new Case(x, y, "Montagne", ""));
                    break;
                case 21:
                    _carte.addCase(new Case(x, y, "Montagne", "Fer"));
                    break;
                case 22:
                    _carte.addCase(new Case(x, y, "Montagne", "Fruit"));
                    break;
                case 3:
                    _carte.addCase(new Case(x, y, "Desert", ""));
                    break;
                case 31:
                    _carte.addCase(new Case(x, y, "Desert", "Fer"));
                    break;
                case 32:
                    _carte.addCase(new Case(x, y, "Desert", "Fruit"));
                    break;
            }
        }

        
    }
}
